/** 
 * \file main.c
 * \version 0.3
 *
 * Contient le corps du jeu
 */

// defines obligatoires pour le compilateur TIGCC
#define USE_V200
#define OPTIMIZE_ROM_CALLS
#define MIN_AMS 100
#define SAVE_SCREEN

#include "main.h"

/* Codes touches V200
 * ESC = 264
 * a = 113
 * z = 119
 * e = 101
 * q = 97
 * s = 115
 * d = 100
 *
 * 0 = 48
 * ..
 * ..
 * 9 = 57
 *
 * en général, chiffre x = x + 48
 */

void _main(void)
{
  // Activer la répétition des touches
  OSFastArrows = 0;
  // Temps entre chaque répétition
  OSInitBetweenKeyDelay(30);
  // Temps avant que la touche ne se répète pour la première fois
  OSInitKeyInitDelay(90);

  short loop = 1;
  unsigned short key;

	clrscr();
  
  grille g = Gnew();

  Gdisplay(g);
  GdisplayAllNumbers(g);
  Smenu(g);
  SidePrintNbLeft(g);

  while( loop )

  {
    // Si une touche a été appuyée
    if( kbhit() )
    {
      key = ngetchx();
      //printf("You pressed %d\n", key);
      
      // Pour l'instant, on efface tout et on réécrit
      ClrScr();

      int flag = 0;

      switch( key )
      { // je suis passe en valeur numeriques pour les KEYS car le compilateur tigcc pour windows ne connait pas ces constantes
        case 264: // ESC
        case 97: // q quit
          loop = 0;	
          break;
        case 344: // KEY_DOWN
          Gmove(g, DOWN);
          break;
        case 340: // KEY_RIGHT
          Gmove(g, RIGHT);
          break;
        case 338: // KEY_UP
          Gmove(g, UP);
          break;
        case 337: // KEY_LEFT
          Gmove(g, LEFT);
          break;
        case 105: // i
        	break;
				case 108: // l
          Gload(g, grid_easy1);
					break;
        case 99: // c pour check
          if( CAll(g) == 1 )
            DrawStr(140,10, "Correct !", A_NORMAL);
          else
            DrawStr(140,10, "Incorrect !", A_NORMAL);
          break;
        case 102: // f pour fixer la grille
          GfixGrid(g);
          break;
        case 115: // s pour solve
          SsolveGrid(g);
          break;
        case 114: // r pour restart
          Grestart(g);
          break;
        case 101: // e pour empty/reset
          Greset(g);
          break;
        case 136: // m pour changer de mode
          GnextMode(g);
          break;

        case 48: // 0
          flag = GtryToSetCurrentNumber(g, 0);
          break;
        case 49: // 1
          flag = GtryToSetCurrentNumber(g, 1);
          break;
        case 50: // 2
          flag = GtryToSetCurrentNumber(g, 2);
          break;
        case 51: // 3
          flag = GtryToSetCurrentNumber(g, 3);
          break;
        case 52: // 4
          flag = GtryToSetCurrentNumber(g, 4);
          break;
        case 53: // 5
          flag = GtryToSetCurrentNumber(g, 5);
          break;
        case 54: // 6
          flag = GtryToSetCurrentNumber(g, 6);
          break;
        case 55: // 7
          flag = GtryToSetCurrentNumber(g, 7);
          break;
        case 56: // 8
          flag = GtryToSetCurrentNumber(g, 8);
          break;
        case 57: // 9
          flag = GtryToSetCurrentNumber(g, 9);
          break;
        default:
          break;
      }
      Gdisplay(g);
      Smenu(g);
      SidePrintNbLeft(g);

      if( flag == -1 )
      {
        /* On a pas le droit de mettre ce nombre dans cette case */
        //DrawStr(140,20, "Cannot do this !", A_NORMAL);
      }
      else
        //DrawStr(140,20, "Number ok !", A_NORMAL);

      GdisplayAllNumbers(g);
    }
    else // Pas de touche détectée
    {
    }
    // Dans tous les cas
  } // Fin du loop

  Gfree(g);

}

